导航菜单
首页 >  寄存器打拍的作用 考试  > 数电实验2:同步寄存与打拍

数电实验2:同步寄存与打拍

1 设计要求分析

        首先我们需要明确同步寄存原理和打拍的概念。

        同步寄存,指对于一个模块而言,其输入信号如果是来自于其他不同时钟频率下的异步数据或不受任何局部时钟控制的突发异步信号,我们有时候需要将这些输入进行数据同步。其原理即利用寄存器跟随时钟上升沿刷新的这一特性,将外部数据同步到本地时钟上来。

        打拍:指对于异步信号输入,即跨时钟区域问题,对异步数据采取延迟打拍的方式进行处理。一般情况,我们会选择将同步寄存好的数据,进行打两拍延迟。

        在本次实验中,我们假设输入信号变化频率和系统内寄存器刷新频率相同,都为本地时钟频率50MHz。但相对于本地时钟而言,输入信号始终是在时钟下降沿进行变动,而系统内寄存器刷新则是在本地时钟上升沿进行,因此此时输入信号也被视为一个异步信号,需要进行同步寄存。异步信号在完成同步寄存之后,本实验再将之进行两拍延迟处理并输出。

2 系统设计 2.1 总体设计思路

        实验采用50MHZ时钟进行系统仿真,总共包括三个模块,分别为同步寄存模块、第一拍寄存模块和第二拍寄存模块。其中同步寄存模块实现将异步输入数据转变为在本地时钟下降沿变化,第一拍寄存模块实现将同步寄存的数据延迟一个时钟周期输出,第二拍寄存模块实现将寄存数据再延迟一个时钟周期输出。

        同时,本实验同样设置一个低电平有效异步复位信号,当复位信号为低时同步寄存和打拍同时复位。

2.2 接口设计 端口数I/O功能描述I_asyn_datainput异步输入数据I_sys_clk_50Mhzinput50Mhz时钟I_sys_rst_ninput低电平有效复位信号O_first_reg_dataoutput同步寄存数据O_first_reg_data_delay_1output第一次打拍后的数据O_first_reg_data_delay_2output第二次打拍后的数据 2.3 同步寄存模块

        输入为I_sys_clk和I_sys_rst_n,为wire型变量,以及reg型变量I_asyn_data,与周期信号计数器类似,同步寄存模块的敏感列表包括时钟上升沿时刻和低电平复位信号下降沿。

       本模块的输出为O_first_reg_data,为wire型变量,引入中间变量为reg型变量的O_first_reg_data_temp,当复位信号有效时,O_first_reg_data_temp非阻塞赋值为0;当复位信号无效时,O_first_reg_data_temp非阻塞赋值为异步信号I_asyn_data。最后将O_first_reg_data_temp的值赋与O_first_reg_data。因为正常的赋值触发发生在时钟的上升沿时刻,因此可以实现同步寄存的目的。

2.4 第一拍寄存模块

        输入为I_sys_clk和I_sys_rst_n,为wire型变量,和上述模块一致,同步寄存模块的敏感列表包括时钟上升沿时刻和低电平复位信号下降沿。

       本模块的输出为O_first_reg_data_delay_1,为wire型变量,引入中间变量O_first_reg_data_temp和O_first_reg_data_delay_1_temp,为reg型变量。当复位信号有效时,O_first_reg_data_delay_1_temp非阻塞赋值为0;当复位信号无效时,O_first_reg_data_delay_1_temp非阻塞赋值为O_first_reg_data_temp的值。最后将O_first_reg_data_delay_1_temp的值赋与O_first_reg_data_delay_1。因为每一次always块敏感触发时,O_first_reg_data_delay_1_temp所获得的值都是上一时钟周期中O_first_reg_data_temp的值,因此可以达到延迟一个时钟周期的目的。

2.5 第二拍寄存模块

        输入为I_sys_clk和I_sys_rst_n,为wire型变量,和上述模块一致,同步寄存模块的敏感列表包括时钟上升沿时刻和低电平复位信号下降沿。

       本模块的输出为O_first_reg_data_delay_2,为wire型变量,引入中间变量O_first_reg_data_delay_1_temp和O_first_reg_data_delay_2_temp,为reg型变量。当复位信号有效时,O_first_reg_data_delay_2_temp非阻塞赋值为0;当复位信号无效时,O_first_reg_data_delay_2_temp非阻塞赋值为O_first_reg_data_delay_1_temp的值。最后将O_first_reg_data_delay_2_temp的值赋与O_first_reg_data_delay_2。因为每一次always块敏感触发时,O_first_reg_data_delay_2_temp所获得的值都是上一时钟周期中O_first_reg_data_delay_1_temp的值,因此可以达到延迟一个时钟周期的目的。

3 功能仿真测试 3.1 源程序设计 `timescale 1ns / 1psmodule R(input[3:0]I_asyn_data,inputI_sys_clk_50MHz,inputI_sys_rst_n,output [3:0]O_first_reg_data,output [3:0]O_first_reg_data_delay_1,output [3:0]O_first_reg_data_delay_2);reg [3:0]O_first_reg_data_temp;reg [3:0]O_first_reg_data_delay_1_temp;reg [3:0]O_first_reg_data_delay_2_temp;assign O_first_reg_data=O_first_reg_data_temp;assign O_first_reg_data_delay_1=O_first_reg_data_delay_1_temp;assign O_first_reg_data_delay_2=O_first_reg_data_delay_2_temp;always @(posedge I_sys_clk_50MHz or negedge I_sys_rst_n) beginif(!I_sys_rst_n) beginO_first_reg_data_temp

相关推荐: